package com.dongdongshop.service.impl;

import com.dongdongshop.pojo.TbItem;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.CartService;
import com.dongdongshop.service.TbgoodService;
import com.dongdongshop.vo.CartVO;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;



@Service
@DubboService
public class CartServiceimpl implements CartService {


    @DubboReference
    TbgoodService tgs;//商品表

    @Autowired
    RedisTemplate redisTemplate;


    //保存购物车
    @Override
    public List<CartVO> addCard(List<CartVO> cartlist, Long skuId, Integer num) {
       //1.根据skuid(主键id)查询sku数据(tb_item商品表数据)
        TbItem tbItem = tgs.selectByid(skuId);
        //2.判断我们当前加入购物车的商品是不是原来购物车属于的那家商家
        String sellerId = tbItem.getSellerId();//获取品牌id
        CartVO oldcart = getCartSellid(cartlist, sellerId);//调用方法判断
        //2.1如果不是，我们只需要创建一个新的购物车(cart)，然后数据放进去，然后把cart放入cartList中
        if(oldcart==null){
            oldcart=new CartVO();//就创建一个新的购物车
            oldcart.setSellerid(sellerId);//购物车id
            List<TbOrderItem> oldList=new ArrayList<>();//购物车集合属性

           TbOrderItem tbOrderItem= createtborderitem(tbItem, num);
            //将新建的购物明细数据，放到购物车属性集合中
            oldList.add(tbOrderItem);
            //将集合放到购物车中
            oldcart.setList(oldList);
            //将购物车放到购物车列表中
            cartlist.add(oldcart);
        }else{//2.2如果是同一个购物车
            List<TbOrderItem> tbList = oldcart.getList();
            TbOrderItem tborderitem = getTborder(tbList, skuId);
            if(tborderitem==null){//判断该用户是否添加该商品，如果添加过，直接修改数量与价格小计,如果没添加过，在此购物车中增加一条数据
                tborderitem= createtborderitem(tbItem,  num);//调用方法赋值
                tbList.add(tborderitem);
           }else{//如果添加过，直接修改数量与价格小计
                tborderitem.setNum(tborderitem.getNum()+num);
                tborderitem.setTotalFee(new BigDecimal(tborderitem.getPrice().doubleValue()*tborderitem.getNum()));
                if(tborderitem.getNum()<=0){//如果商品数量小于1，就移除掉此商家中的此商品
                    tbList.remove(tborderitem);
                }
                if(tbList.size()==0){//如果此商家已经没有了商品，就移除掉此商家
                    cartlist.remove(oldcart);
                }
            }
        }


        return cartlist;
    }

    //封装方法1，判断当前商品id是否属于购物车(cart)的id
    //判断加入的这个商品的商家id，在购物车集合中是否有这个商家
    private CartVO getCartSellid(List<CartVO> cartList,String sellerId){
        for (CartVO cart: cartList) {
            if(cart.getSellerid().equals(sellerId)){
                return cart;
            }
        }
        return null;
    }

    //封装方法2，如果购物车集合中有这个商家购物车，
    //然后判断新加入的这个商品，在这个商家中是否买过，如果买过，直接修改数量与价格
    //如果没买过，将新加一条商品数据
    private TbOrderItem getTborder(List<TbOrderItem> tbList,Long skuId){
        for (TbOrderItem ls: tbList) {
            if(skuId.equals(ls.getItemId())){
                return ls;
            }
        }
        return null;
    }


    //封装3，赋值
    private TbOrderItem createtborderitem(TbItem tbItem, Integer num){
        TbOrderItem tborderitem=new TbOrderItem();
        tborderitem.setSellerId(tbItem.getSellerId());
        tborderitem.setNum(num);
        tborderitem.setGoodsId(tbItem.getGoodsId());
        tborderitem.setPrice(tbItem.getPrice());
        tborderitem.setTotalFee(new BigDecimal( tbItem.getPrice().doubleValue() *num));//小计  当前商品数量* 商品单价
        tborderitem.setTitle(tbItem.getTitle());
        tborderitem.setPicPath(tbItem.getImage());
        tborderitem.setItemId(tbItem.getId());
        return tborderitem;
    }


    //如果登录的话，从redis里面获取数据
    @Override
    public List<CartVO> getCartredis(Long id) {
        List<CartVO> cartlist = (List<CartVO>) redisTemplate.boundHashOps("cartlist").get(id);
        if(cartlist==null){
            return new ArrayList<>();
        }
        return cartlist;
    }
    //如果登录，向redis存数据
    @Override
    public void addCartredis(Long id, List<CartVO> cartlist) {
        redisTemplate.boundHashOps("cartlist").put(id,cartlist);
    }

    //合并cookie与redis购物车
    @Override
    public List<CartVO> mergeCartlist(List<CartVO> cart, List<CartVO> cartredis) {
        for (CartVO redis: cartredis) {
            List<TbOrderItem> orderlist = redis.getList();
            for (TbOrderItem ls:orderlist) {
               cart= addCard(cart,ls.getItemId(),ls.getNum());
            }
        }
        return cart;
    }
}
